package basic13;

import java.util.ArrayList;

public class J22_Generic {

	public static void main(String[] args) {
		// 컬렉션 프레임워크를 구성하는 핵심 기술
		// 흔히, 타입매개변수라고 불리우는 <E>,<K>,<V>등의 다이아몬드 기호를
		// 이용해서 컬렉션의 요소들을 [일반화] 할 수 있음
		// 이것을 통해 엄격한 자료형 검사도 할 수 있고 불필요햔 형변환도 방지할 수 있음
		J22_Tiger tiger = new J22_Tiger();
		J22_Lion lion = new J22_Lion();
		J22_Zebra zebra = new J22_Zebra();

		ArrayList zoo = new ArrayList();
		zoo.add(tiger);
		zoo.add(lion);
		zoo.add(zebra);

		// tiger=zoo.get(0); 오류!!
		tiger = (J22_Tiger) zoo.get(1);
		// 배열에서 꺼내올때 형 변환이 필요하다.
		lion = (J22_Lion) zoo.get(2);
		// 하지만 아래의 문제가 발생할 수 있음!!
		// zebra=(J22_Zebra)zoo.get(0);
		// Exception in thread "main" java.lang.ClassCastException:
		// basic13.J22_Lion cannot be cast to basic13.J22_Tiger
		// 즉, 엄격한 자료형 검사를 컴파일 단계에서 하지 않았기 때문에 실행시 오류가 표시됨

		/*---------------------------------------------------------------------------------------------*/
		// <E> : Element, 배열의 요소의 자료형
		//<>에 생략가능
		ArrayList<J22_Tiger> cage1 = new ArrayList<J22_Tiger>();
		ArrayList<J22_Lion> cage2 = new ArrayList<J22_Lion>(); //JDK7
		ArrayList<J22_Zebra> cage3 = new ArrayList<J22_Zebra>();//JDK7
		// ArrayList에 타입 매개변수로 Tiger를 지정하면
		// 해당 ArrayList에는 Tiger형의 객체만 저장가능

		cage1.add(tiger);
		// cage1.add(lion);
		// cage1.add(zebra);
		//불필요한 type casting 제거
		tiger = cage1.get(0);
		// lion=cage1.get(0); 컴파일 시점에 자료형 불일치 오류 표시

	}
}

class J22_Tiger {
	public void howl() {
		System.out.println("호랑이가 울어요");
	}
}

class J22_Lion {
	public void howl() {
		System.out.println("사자가 울어요");
	}
}

class J22_Zebra {
	public void howl() {
		System.out.println("얼룩말이가 울어요");
	}

}
